package com.enlorenz.common.geo.analyzer.distance.calc;

import com.copote.adc.paramproc.IStatusModelParamProc;
import com.enlorenz.common.geo.analyzer.distance.IDataCalculator;
import com.enlorenz.common.geo.util.GeographyUtil;
import com.enlorenz.common.geo.util.PublicUtil;
import com.enlorenz.core.objectmodel.attribute.MileCountAttribute;
import com.enlorenz.core.objectmodel.entity.IStatus;

/**
 * 点距离里程混合计算
 * @author Karma
 *
 */
public class PointMileMixedDisCalc implements IDataCalculator{
	private IStatus preStatus;
	private double totalDis=0;
	private IStatusModelParamProc statusModelParamProc;
	public void setStatusModelParamProc(IStatusModelParamProc statusModelParamProc) {
		this.statusModelParamProc = statusModelParamProc;
	}
	public IStatusModelParamProc getStatusModelParamProc() {
		return statusModelParamProc;
	}
	@Override
	public void doIterator(int total, int index, IStatus status) {
		if(statusModelParamProc.isHistoryStatus(status)){
			return;
		}
		
		if(null == preStatus){
			preStatus=status;
			return;
		}
		
		if(statusModelParamProc.isGpsLock(preStatus) && statusModelParamProc.isGpsLock(status)
				&& ((!preStatus.getSpeed().equals("0") && status.getSpeed().equals("0"))
				||!status.getSpeed().equals("0")) && (!preStatus.getLon().equals("0") &&!preStatus.getLat().equals("0")&&
						!status.getLon().equals("0") &&!status.getLat().equals("0"))){
				double dis=GeographyUtil.computerDistanceFromPoint(preStatus, status);
				totalDis+=dis;
		}else{
			MileCountAttribute mca=(MileCountAttribute)status;
			MileCountAttribute pMca=(MileCountAttribute)preStatus;
			
			if(!PublicUtil.isStrEmpty(pMca.getMileCount())
					&&!PublicUtil.isStrEmpty(mca.getMileCount())){
				
				Double preDis=Double.valueOf(pMca.getMileCount());
				Double nowDis=Double.valueOf(mca.getMileCount());
				
				if(nowDis>=preDis){
					totalDis+=(nowDis-preDis);
				}
			}
		}
		
		preStatus=status;
	}

	@Override
	public String getResult() {
		return String.valueOf(totalDis);
	}

}
